package LuoGuACM;
//旅行家的预算
import java.util.Scanner;
class Main{
    static double D1,C,D2,P,Sum,nextD;
    static int N;
    static int nowPosition;//现在的位置
    static double curCapacity;//当期油量
    static double extra;//剩余油能多走的路程
    static double maxDis;//加满油最远能走的距离
    static int next,end;// next:下一个要去(最优)的地方；end: 能去到的最远站点的下标
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        D1 = in.nextDouble();//两个城市之间的距离
        C  = in.nextDouble();//汽车油箱的容量
        D2 = in.nextDouble();//每升汽油能行驶的距离
        P  = in.nextDouble();//出发点每升汽油价格
        N  = in.nextInt();   //沿途油站数
        maxDis = C*D2;
        double[] Di = new double[N+2];//油站 i 离出发点的距离
        double[] Pi = new double[N+2];//每油站汽油价格
        Di[N+1] = D1;
        Pi[0] = P;Pi[N+1] = Double.MAX_VALUE;//把目的地的油价置为足够大
        for (int i = 1; i <= N; i++) {//输入Di和Pi
            Di[i] = in.nextDouble();Pi[i] = in.nextDouble();
        }

        while (true){
            end = findEnd(nowPosition,Di);
            if (end == -1) {//找不到能去的地方
                System.out.println("No Solution");return;
            } else if (end == nowPosition) {
                if (nowPosition == N+1)break;// 已经到达目的地
                else System.out.println("No Solution");return;//连下一个油站都到不了
            }

            next = findMin(nowPosition,end,Pi);//找到最优的地方
            if (next == nowPosition) {//最优位置是当前位置，直接走到能走到的最远的油站
                if (extra!= 0  || end == N+1){//当到最远的油站时有剩余能走的里程(油) 或者 能走到最远的位置是目的地时
                    Sum+=Pi[nowPosition]*(Di[end]-Di[nowPosition]-extra)/D2;
                }else{//当到最远的位置还有剩余里程(油)
                    extra = maxDis - (Di[end]-Di[nowPosition]);//多余的油多走的里程
                    Sum += C*Pi[nowPosition];
                }
                nowPosition = end;
                continue;
            }
            nextD = Di[next]-Di[nowPosition] - extra;//下个要去的站点到现在位置的距离
            curCapacity = nextD/D2;//去下个站点需要的油量
            Sum += Pi[nowPosition] * (curCapacity);
            nowPosition = next;//走到下一个地方
            extra = 0;
        }
        System.out.printf("%.2f",Math.round(Sum*100.0)/100.0);
    }

    private static int findEnd(int nowPosition, double[] Di) {//找到满油能到的最后一个位置
        int endIndex;
        for (endIndex = nowPosition; endIndex <= N+1 ; endIndex++) {
            if (endIndex == N+1 && Di[endIndex]-Di[nowPosition]<=C * D2) return endIndex;// 找到最后也没找到，即能到最远位置是目的地。
            if (Di[endIndex]-Di[nowPosition]<=(maxDis) && Di[endIndex+1]-Di[nowPosition]>(C * D2)) break;//找到了最远位置
        }
        if (endIndex < N+1) return endIndex;
        else return -1;
    }

    private static int findMin(int start, int end, double[] Pi) {//找下一个要去的位置
        double min = Pi[start];
        int minIndex = start;
        for (int i = start; i <= end; i++) {
            if (Pi[i] < min) {
                min = Pi[i];
                minIndex = i;
                break;
            }
        }
        return minIndex;
    }
}

//解法2
class Main01 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
//        System.out.println("请输入D1、C、D2、P");
        double D1=sc.nextDouble();//两个城市之间的举例
        double C=sc.nextDouble();//油箱的体积
        double D2=sc.nextDouble();//每升汽油的行驶距离
        double P=sc.nextDouble();//出发点每升汽油的价格
        int N=sc.nextInt();//沿途加油站的个数

        double[] dis=new double[N+2];// 定义数组表示，距离加油站的路程
        double[] pri=new double[N+2];// 定义数组表示，每个加油站的油价
        dis[0]=0;dis[N+1]=D1;
        pri[0]=P;pri[N+1]=0;
        for (int i = 1; i <= N; i++) {
//            System.out.println("请输入Di、Pi");
            dis[i]=sc.nextDouble();
            pri[i]=sc.nextDouble();
        }

        double maxRun=C*D2;//油箱加满油，可以行驶的最远距离
        double money=0;//初始化花费
        double remain=0;//初始化到达下个加油站时，油箱里剩余的油量

        //如果两个加油站之间的距离，超过了maxRun，则判定无解
        for (int i=0;i<=N;i++){
            if ((dis[i + 1] - dis[i])>maxRun){
                System.out.println("No Solution");
                return;
            }
        }

        int i=0;
        while (i<=N){
            int j;
            for (j=i+1;j<=N+1;j++){
                if ((dis[j] - dis[i])>maxRun){
                    j=j-1;break;//maxRun无法到达j,就到达j-1
                }
                if (pri[j]<=pri[i]){
                    break;//如果下个油站油价更便宜，就跳出加油
                }
            }

            //加油和更新money

            if (pri[j]<=pri[i]){//如果下个油站油价更便宜，就只加能跑到下个油站的油
                money+=((dis[j]-dis[i])/D2-remain)*pri[i];
                remain=0;//因为只加了能跑到下个油站的油，所以跑到后，remain清零
            }else {//下个油站的油价比我还贵，我就直接加满
                money+=(C-remain)*pri[i];
                remain=C-(dis[j]-dis[i])/D2;
            }
            i=j;
        }
        System.out.println(String.format("%.2f",money));
    }
}
